/**
 实现3
 方法：symbol+闭包
 优点
 1.无命名冲突
 2.外部无法访问和修改
 3.无性能损失
 4.不会被枚举

 缺点

 1.写法稍微复杂
 2.兼容性也还好

 我们把 Symbol 当作实例属性的键来使用。
 这种方式也不会在枚举属性和 JSON.stringify 时呈现出来。这个技巧需要为每个私有属性创建 Symbol。
 不过，只要能访问到这些 Symbol 值，那么在类之外同样也能访问以它们为键的属性。
 */
const Example = (function() {
    var _private = Symbol();

    class Example {
        constructor() {
            this.notPrivate = 'notPrivate'
            this[_private] = 'private';
        }
        getName() {
            return this[_private];
        }
    }

    return Example;
})();

var ex3 = new Example();

console.log('3--------------------------')
console.log(ex3 instanceof Example) //true
console.log(ex3.getName()); // private
for (const key in ex3) {           // 私有属性不会被枚举
    console.log(key+'...');  // notPrivate...
}

console.log(JSON.stringify(ex3)); // {"notPrivate":"notPrivate"}